package com.sso.auth.ssobackend.controller;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证控制器 - 处理用户登录认证请求
 * 该控制器负责处理SSO系统的登录认证流程，包含以下核心功能：
 * 1. 处理跨域请求配置
 * 2. 凭证验证
 * 3. 安全Cookie的创建与配置
 * 4. 标准化响应格式处理
 */
@Slf4j
@RestController
@RequestMapping("/auth")
@CrossOrigin(origins = "http://login.sso.com:8080", allowCredentials = "true") // 允许指定来源的跨域请求并携带凭证
public class AuthController {

    /**
     * 登录接口
     * 处理登录请求，验证用户凭证有效性：
     * - 验证通过时创建认证Cookie并返回成功响应
     * - 验证失败时返回401未授权状态码
     *
     * @param username 用户名参数（表单提交）
     * @param password 密码参数（表单提交）
     * @param response HTTP响应对象，用于添加认证Cookie
     * @return ResponseEntity 包含操作结果的标准化响应实体
     */
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestParam String username,
                                   @RequestParam String password,
                                   HttpServletResponse response) {
        // 验证用户凭证（硬编码）
        if ("123456".equals(username) && "123456".equals(password)) {
            // 创建认证Cookie
            Cookie cookie = new Cookie("ssoid", "abcdef123456");
            cookie.setPath("/");          // 设置Cookie作用路径为根路径
            cookie.setHttpOnly(false);    // 允许客户端脚本访问
            cookie.setSecure(false);      // 允许HTTP协议传输
            cookie.setMaxAge(3600);       // 设置Cookie有效期为1小时
            cookie.setDomain("sso.com");  // 设置Cookie作用域为sso.com主域

            // 将Cookie添加到HTTP响应
            response.addCookie(cookie);

            // 构建成功响应
            Map<String, String> result = new HashMap<>();
            result.put("status", "success");

            return ResponseEntity.ok(result); // 返回200 OK状态码
        } else {
            // 构建错误响应（401未授权）
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
                    .body("用户名或密码错误");
        }
    }
}